#include <iostream>
using namespace std;

//int main()
//{
//	int* p1 = new int;
//	delete p1;
//
//	int* p2 = new int[10];
//	delete[] p2;
//
//	int* p3 = new int(4);
//	delete p3;
//
//	int* p4 = new int[10] {1,2,3,4,5,6,7,8,9,10};
//	delete[] p4;
//	return 0;
//}

//class A
//{
//public:
//	A(int a = 0) :_a(a) 
//	{
//		cout << "A(int a)" << endl;
//	}
//	~A() 
//	{
//		cout << "~A()" << endl;
//	}
//private:
//	int _a;
//};
//
//int main()
//{
//	//A* pa = new A;
//	//A* pb = new A(6);
//	//delete pa;
//	//delete pb;
//
//	A a1(1);
//	A a2(1);
//	A a3(1);
//	A* pa1 = new A[3]{ a1,a2,a3 };
//	A* pa2 = new A[3]{ A(1),A(2),A(3) };
//	A* pa3 = new A[3]{ 1,2,3 };
//
//	delete[] pa1;
//	delete[] pa2;
//	delete[] pa3;
//
//	return 0;
//}

//int main()
//{
//	try
//	{
//		char* p1 = new char[1024 * 1024 * 1024];
//		cout << (void*)p1 << endl;
//
//		char* p2 = new char[1024 * 1024 * 1024];
//		cout << (void*)p2 << endl;
//	}
//	catch (const exception& e)
//	{
//		cout << e.what() << endl;
//	}
//
//	return 0;
//}

//template<typename T>
//void Swap(T& left, T& right)
//{
//	T temp = left;
//	left = right;
//	right = temp;
//}

//template<class T1,class T2>
//void fun(const T1& x,const T2& y)
//{
//	cout << x << endl;
//	cout << y << endl;
//}
//
//int main()
//{
//	fun(1, 2.2);
//	fun(1, 2);
//	fun(1.1, 'x');
//	return 0;
//}


//int main()
//{
//	fun(1,2.2);
//	//int a = 10;
//	//int b = 20;
//	//double c = 1.5;
//	//double d = 5.5;
//	//Swap(a, b);
//	//Swap(c,d);
//	return 0;
//}

//template<class T>
//T Add(T x, T y)
//{
//	return x + y;
//}
//
//template<class T1,class T2>
//void fun(T1 x,T2 y)
//{
//	cout << x << y << endl;
//}
//
//template<class T>
//T* f()
//{
//	T* p = new T[10];
//	return p;
//}
//
//int main()
//{
//	cout << Add<int>(3,4) << endl;
//	fun<char, double>('x', 1.24);
//	return 0;
//}

template<class T>
class Stack
{
public:
	Stack(int capacity = 4);
	~Stack();
private:
	T* _a;
	int _top;
	int _capacity;
};

template<class T>
Stack<T>::Stack(int capacity)
{
	cout << "Stack(int capacity = 4)" << endl;
	_a = new T[capacity];
	_top = 0;
	_capacity = capacity;
}
template<class T>
Stack<T>::~Stack()
{
	cout << "~Stack()" << endl;
	delete[] _a;
	_a = nullptr;
	_top = 0;
	_capacity = 0;
}

int main()
{
	Stack<int> st1;
	Stack<int> * st2 = new Stack<int>(5);
	delete st2;
	return 0;
}

//int Add(int x, int y)
//{
//	return x + y;
//}
//template<class T>
//T Add(T x, T y)
//{
//	return x + y;
//}
//
//int main()
//{
//	Add(1, 2);
//	Add(2.2,4.4);
//	return 0;
//}



